﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml.Linq;
using CoreEveMarkets;
using EveMarkets.UserControls;
using EveMarketsDAO;

namespace EveMarkets.Views
{
	/// <summary>
	/// Logique d'interaction pour Profil.xaml
	/// </summary>
	public partial class Profil : Page
	{
		public Profil()
		{
			InitializeComponent();
			
			// Initialisation pour donnée la liste de lvl de skill
			IList listProd = new List<int>{0,1,2,3,4,5};
			cBoxIndustry.ItemsSource = listProd;
			cBoxProdEff.ItemsSource = listProd;

			// Chargement de la liste des profils dans le comboBox
			ListProfils();

			ucChoixSystemeAchat.ListRegion = ContexteDAO.ChargeListeDesRegions().ToList();
			ucChoixSystemeVente.ListRegion = ContexteDAO.ChargeListeDesRegions().ToList();
		}
		
		/// <summary>
		/// Permet de faire une sauvegarde dans la base du Profil.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void btnSauvegarder_Click(object sender, RoutedEventArgs e)
		{
			#region Test sur les champs

			// Test sur le nom du profil.
			if(String.IsNullOrEmpty(txtBoxNomProfil.Text))
			{
				lblError.Content = @"Il manque un nom de profil";
				imgErrorNom.Visibility = Visibility.Visible;
				return;
			}
			imgErrorNom.Visibility = Visibility.Hidden;

			// Test sur la station d'achat.
			if (ucChoixSystemeAchat.cBoxStation.Items.IsEmpty)
			{
				lblError.Content = @"Aucune station d'achat sélectionnée";
				return;
			}
			// Test sur la station de vente.
			if (ucChoixSystemeVente.cBoxStation.Items.IsEmpty)
			{
				lblError.Content = @"Aucune station de vente sélectionnée";
				return;
			}

			// Test sur les Skills
			if(cBoxIndustry.Items.IsEmpty)
			{
				lblError.Content = @"Niveau du skill Industry, non sélectionné";
				return;
			}
			if (cBoxProdEff.Items.IsEmpty)
			{
				lblError.Content = @"Niveau du skill Production Eff, non sélectionné";
				return;
			}

			lblError.Content = "";

			#endregion

			string temp = comboBoxListProfil.Text;

			#region Sauvegarde
			// Sauvegarde du profil en base.
			if (!SauvegarderProfil(txtBoxNomProfil.Text, Convert.ToInt16(cBoxIndustry.Text),
					Convert.ToInt16(cBoxProdEff.Text), ucChoixSystemeAchat.cBoxStation.Text,
					ucChoixSystemeVente.cBoxStation.Text))
			{
				lblError.Content = @"Erreur de sauvegarde";
			}

			// Chargement de la liste des profils dans le comboBox
			ListProfils();

			comboBoxListProfil.Text = temp;

			#endregion
		}

		/// <summary>
		/// Va chercher la liste de profils.
		/// </summary>
		/// <returns></returns>
		private void ListProfils()
		{
			comboBoxListProfil.ItemsSource = null;
			comboBoxListProfil.ItemsSource = ContexteDAO.ContexteDonnees.Profils.Where(x => !String.IsNullOrEmpty(x.NomProfil)).Select(x => x.NomProfil);
		}

		/// <summary>
		/// Permet de faire une sauvegarde dans la base du Profil.
		/// </summary>
		/// <param name="nomProfil">Nom du profil choisi</param>
		/// <param name="skillIndustry">level du skill Industry</param>
		/// <param name="skillProd">level du skill Production Efficiency</param>
		/// <param name="staAchat">Id de la station d'achat</param>
		/// <param name="staVente">Id de la station de vente</param>
		/// <returns>Retourne si oui ou non la sauvegarde s'est bien passé.</returns>
		private bool SauvegarderProfil(string nomProfil, short skillIndustry, short skillProd, string staAchat, string staVente)
		{
			ContexteDAO.SaveProfil(nomProfil, skillIndustry, skillProd, staAchat, staVente);
			
			return true;
		}

		/// <summary>
		/// Event qui charge le profil sélectionné.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void comboBoxListProfil_SelectionChanged(object sender, SelectionChangedEventArgs e)
		{
			var selectionCombo = sender as ComboBox;
			if (selectionCombo.SelectedValue != null)
				ChargerLeProfil(selectionCombo.SelectedValue.ToString());		
		}

		/// <summary>
		/// Charge un profil de la BDD en fonction de son nom
		/// </summary>
		/// <param name="nomProfilLoad"></param>
		private void ChargerLeProfil(string nomProfilLoad)
		{
			// Chargement du profils
			Profils profilsDataBase = ContexteDAO.ContexteDonnees.Profils.Where(r => r.NomProfil.Equals(nomProfilLoad)).Select(x => x).First();

			#region Affichage des données.

			if(AffichageData(profilsDataBase))
				ProfilProvider.ChargerProfil(profilsDataBase.NomProfil, Convert.ToInt32(profilsDataBase.SkillIndustry), Convert.ToInt32(profilsDataBase.SkillProdEff), profilsDataBase.stationAchat.ToString(), profilsDataBase.stationVente.ToString());
			
			#endregion
		}

		/// <summary>
		/// Affiche les données du profils chargé dans les différents éléments.
		/// </summary>
		/// <param name="profilsDataBase"></param>
		/// <returns></returns>
		private bool AffichageData(Profils profilsDataBase)
		{
			try
			{
				cBoxIndustry.SelectedIndex = profilsDataBase.SkillIndustry;
				cBoxProdEff.SelectedIndex = profilsDataBase.SkillProdEff;
				txtBoxNomProfil.Text = profilsDataBase.NomProfil;

				// Affichage pour la zone Achat.
				ucChoixSystemeAchat.cBoxRegion.Text =
					ContexteDAO.ContexteDonnees.staStations.Where(x => x.stationID.Equals(profilsDataBase.stationAchat)).Select(
						y => y.mapRegions.regionName).First();
				ucChoixSystemeAchat.cBoxSystem.Text =
					ContexteDAO.ContexteDonnees.staStations.Where(x => x.stationID.Equals(profilsDataBase.stationAchat)).Select(
						y => y.mapSolarSystems.solarSystemName).First();
				ucChoixSystemeAchat.cBoxStation.Text =
					ContexteDAO.ContexteDonnees.staStations.Where(x => x.stationID.Equals(profilsDataBase.stationAchat)).Select(
						y => y.stationName).First();

				// Affichage pour la zone Vente.
				ucChoixSystemeVente.cBoxRegion.Text =
					ContexteDAO.ContexteDonnees.staStations.Where(x => x.stationID.Equals(profilsDataBase.stationVente)).Select(
						y => y.mapRegions.regionName).First();
				ucChoixSystemeVente.cBoxSystem.Text =
					ContexteDAO.ContexteDonnees.staStations.Where(x => x.stationID.Equals(profilsDataBase.stationVente)).Select(
						y => y.mapSolarSystems.solarSystemName).First();
				ucChoixSystemeVente.cBoxStation.Text =
					ContexteDAO.ContexteDonnees.staStations.Where(x => x.stationID.Equals(profilsDataBase.stationVente)).Select(
						y => y.stationName).First();

				return true;
			}
			catch(Exception ex)
			{
				return false;
			}
		}

	}
}
